/**
 * @description  百度地图微信小程序API类.
 *
 * @class
 */
class BMapWX {
  /**
   * @description  百度地图微信小程序API类.
   *
   * @class
   */
  constructor(param) {
    this.ak = param['ak']
  }

  /**
   * @description  使用微信接口进行定位.
   *
   * @param  {string}    type      坐标类型.
   * @param  {Function}  success   成功执行.
   * @param  {Function}  fail      失败执行.
   * @param  {Function}  complete  完成后执行.
   */
  getWXLocation(type, success, fail, complete) {
    ;(type = type || 'gcj02'), (success = success || function () {})
    fail = fail || function () {}
    complete = complete || function () {}
    wx.getLocation({
      type: type,
      success: success,
      fail: fail,
      complete: complete,
    })
  }

  /**
   * @description  POI周边检索.
   *
   * @param  {Object}  param  检索配置 参数对象结构可以参考
   *   http://lbsyun.baidu.com/index.php?title=webapi/guide/webservice-placeapi.
   */
  search(param) {
    let that = this
    param = param || {}
    let searchparam = {
      query: param['query'] || '生活服务$美食&酒店',
      scope: param['scope'] || 1,
      filter: param['filter'] || '',
      coord_type: param['coord_type'] || 2,
      page_size: param['page_size'] || 10,
      page_num: param['page_num'] || 0,
      output: param['output'] || 'json',
      ak: that.ak,
      sn: param['sn'] || '',
      timestamp: param['timestamp'] || '',
      radius: param['radius'] || 2000,
      ret_coordtype: 'gcj02ll',
    }
    let otherparam = {
      iconPath: param['iconPath'],
      iconTapPath: param['iconTapPath'],
      width: param['width'],
      height: param['height'],
      alpha: param['alpha'] || 1,
      success: param['success'] || function () {},
      fail: param['fail'] || function () {},
    }
    let type = 'gcj02'
    let locationsuccess = function (result) {
      searchparam['location'] = result['latitude'] + ',' + result['longitude']
      wx.request({
        url: 'https://api.map.baidu.com/place/v2/search',
        data: searchparam,
        header: {
          'content-type': 'application/json',
        },
        method: 'GET',
        success(data) {
          let res = data['data']
          if (res['status'] === 0) {
            let poiArr = res['results']
            // outputRes 包含两个对象，
            // originalData为百度接口返回的原始数据
            // wxMarkerData为小程序规范的marker格式
            let outputRes = {}
            outputRes['originalData'] = res
            outputRes['wxMarkerData'] = []
            for (let i = 0; i < poiArr.length; i++) {
              outputRes['wxMarkerData'][i] = {
                id: i,
                latitude: poiArr[i]['location']['lat'],
                longitude: poiArr[i]['location']['lng'],
                title: poiArr[i]['name'],
                iconPath: otherparam['iconPath'],
                iconTapPath: otherparam['iconTapPath'],
                address: poiArr[i]['address'],
                telephone: poiArr[i]['telephone'],
                alpha: otherparam['alpha'],
                width: otherparam['width'],
                height: otherparam['height'],
              }
            }
            otherparam.success(outputRes)
          } else {
            otherparam.fail({
              errMsg: res['message'],
              statusCode: res['status'],
            })
          }
        },
        fail(data) {
          otherparam.fail(data)
        },
      })
    }
    let locationfail = function (result) {
      otherparam.fail(result)
    }
    let locationcomplete = function (result) {}
    if (!param['location']) {
      that.getWXLocation(type, locationsuccess, locationfail, locationcomplete)
    } else {
      let longitude = param.location.split(',')[1]
      let latitude = param.location.split(',')[0]
      let errMsg = 'input location'
      let res = {
        errMsg: errMsg,
        latitude: latitude,
        longitude: longitude,
      }
      locationsuccess(res)
    }
  }

  /**
   * @description  Sug模糊检索.
   *
   * @param  {Object}  param  检索配置 参数对象结构可以参考
   *   http://lbsyun.baidu.com/index.php?title=webapi/place-suggestion-api.
   */
  suggestion(param) {
    let that = this
    param = param || {}
    let suggestionparam = {
      query: param['query'] || '',
      region: param['region'] || '全国',
      city_limit: param['city_limit'] || false,
      output: param['output'] || 'json',
      ak: that.ak,
      sn: param['sn'] || '',
      timestamp: param['timestamp'] || '',
      ret_coordtype: 'gcj02ll',
    }
    let otherparam = {
      success: param['success'] || function () {},
      fail: param['fail'] || function () {},
    }
    wx.request({
      url: 'https://api.map.baidu.com/place/v2/suggestion',
      data: suggestionparam,
      header: {
        'content-type': 'application/json',
      },
      method: 'GET',
      success(data) {
        let res = data['data']
        if (res['status'] === 0) {
          otherparam.success(res)
        } else {
          otherparam.fail({
            errMsg: res['message'],
            statusCode: res['status'],
          })
        }
      },
      fail(data) {
        otherparam.fail(data)
      },
    })
  }

  /**
   * @description  Rgc检索（逆地理编码：经纬度->地点描述）
   *
   * @param  {Object}  param  检索配置 参数对象结构可以参考
   *   https://lbs.baidu.com/index.php?title=webapi/guide/webservice-geocoding-abroad.
   */
  regeocoding(param) {
    let that = this
    param = param || {}
    let regeocodingparam = {
      coordtype: param['coordtype'] || 'gcj02ll',
      ret_coordtype: 'gcj02ll',
      radius: param['radius'] || 1000,
      ak: that.ak,
      sn: param['sn'] || '',
      output: param['output'] || 'json',
      callback: param['callback'] || function () {},
      extensions_poi: param['extensions_poi'] || 1,
      extensions_road: param['extensions_road'] || false,
      extensions_town: param['extensions_town'] || false,
      language: param['language'] || 'zh-CN',
      language_auto: param['language_auto'] || 0,
    }
    let otherparam = {
      iconPath: param['iconPath'],
      iconTapPath: param['iconTapPath'],
      width: param['width'],
      height: param['height'],
      alpha: param['alpha'] || 1,
      success: param['success'] || function () {},
      fail: param['fail'] || function () {},
    }
    let type = 'gcj02'
    let locationsuccess = function (result) {
      regeocodingparam['location'] = result['latitude'] + ',' + result['longitude']
      wx.request({
        url: 'https://api.map.baidu.com/reverse_geocoding/v3',
        data: regeocodingparam,
        header: {
          'content-type': 'application/json',
        },
        method: 'GET',
        success(data) {
          let res = data['data']
          if (res['status'] === 0) {
            let poiObj = res['result']
            // outputRes 包含两个对象：
            // originalData为百度接口返回的原始数据
            // wxMarkerData为小程序规范的marker格式
            let outputRes = {}
            outputRes['originalData'] = res
            outputRes['wxMarkerData'] = []
            outputRes['wxMarkerData'][0] = {
              id: 0,
              latitude: result['latitude'],
              longitude: result['longitude'],
              address: poiObj['formatted_address'],
              iconPath: otherparam['iconPath'],
              iconTapPath: otherparam['iconTapPath'],
              desc: poiObj['sematic_description'],
              business: poiObj['business'],
              alpha: otherparam['alpha'],
              width: otherparam['width'],
              height: otherparam['height'],
            }
            otherparam.success(outputRes)
          } else {
            otherparam.fail({
              errMsg: res['message'],
              statusCode: res['status'],
            })
          }
        },
        fail(data) {
          otherparam.fail(data)
        },
      })
    }
    let locationfail = function (result) {
      otherparam.fail(result)
    }
    let locationcomplete = function (result) {}
    if (!param['location']) {
      that.getWXLocation(type, locationsuccess, locationfail, locationcomplete)
    } else {
      let longitude = param.location.split(',')[1]
      let latitude = param.location.split(',')[0]
      let errMsg = 'input location'
      let res = {
        errMsg: errMsg,
        latitude: latitude,
        longitude: longitude,
      }
      locationsuccess(res)
    }
  }

  /**
   * @description  Gc检索（地理编码：地点->经纬度）
   *
   * @param  {Object}  param  检索配置 参数对象结构可以参考
   *   https://lbs.baidu.com/index.php?title=webapi/guide/webservice-geocoding.
   */
  geocoding(param) {
    let that = this
    param = param || {}
    let geocodingparam = {
      address: param['address'] || '',
      city: param['city'] || '',
      ret_coordtype: param['coordtype'] || 'gcj02ll',
      ak: that.ak,
      sn: param['sn'] || '',
      output: param['output'] || 'json',
      callback: param['callback'] || function () {},
    }
    let otherparam = {
      iconPath: param['iconPath'],
      iconTapPath: param['iconTapPath'],
      width: param['width'],
      height: param['height'],
      alpha: param['alpha'] || 1,
      success: param['success'] || function () {},
      fail: param['fail'] || function () {},
    }
    if (param['address']) {
      wx.request({
        url: 'https://api.map.baidu.com/geocoding/v3',
        data: geocodingparam,
        header: {
          'content-type': 'application/json',
        },
        method: 'GET',
        success(data) {
          let res = data['data']
          if (res['status'] === 0) {
            let poiObj = res['result']
            // outputRes 包含两个对象：
            // originalData为百度接口返回的原始数据
            // wxMarkerData为小程序规范的marker格式
            let outputRes = res
            outputRes['originalData'] = res
            outputRes['wxMarkerData'] = []
            outputRes['wxMarkerData'][0] = {
              id: 0,
              latitude: poiObj['location']['lat'],
              longitude: poiObj['location']['lng'],
              iconPath: otherparam['iconPath'],
              iconTapPath: otherparam['iconTapPath'],
              alpha: otherparam['alpha'],
              width: otherparam['width'],
              height: otherparam['height'],
            }
            otherparam.success(outputRes)
          } else {
            otherparam.fail({
              errMsg: res['message'],
              statusCode: res['status'],
            })
          }
        },
        fail(data) {
          otherparam.fail(data)
        },
      })
    } else {
      let errMsg = 'input address!'
      let res = {
        errMsg: errMsg,
      }
      otherparam.fail(res)
    }
  }

  /**
   * @description  天气检索.
   *
   * @param  {Object}  param  检索配置.
   */
  weather(param) {
    let that = this
    param = param || {}
    let weatherparam = {
      coord_type: param['coord_type'] || 'gcj02',
      output: param['output'] || 'json',
      ak: that.ak,
      sn: param['sn'] || '',
      timestamp: param['timestamp'] || '',
    }
    let otherparam = {
      success: param['success'] || function () {},
      fail: param['fail'] || function () {},
    }
    let type = 'gcj02'
    let locationsuccess = function (result) {
      weatherparam['location'] = result['longitude'] + ',' + result['latitude']
      wx.request({
        url: 'https://api.map.baidu.com/telematics/v3/weather',
        data: weatherparam,
        header: {
          'content-type': 'application/json',
        },
        method: 'GET',
        success(data) {
          let res = data['data']
          if (res['error'] === 0 && res['status'] === 'success') {
            let weatherArr = res['results']
            // outputRes 包含两个对象，
            // originalData为百度接口返回的原始数据
            // wxMarkerData为小程序规范的marker格式
            let outputRes = {}
            outputRes['originalData'] = res
            outputRes['currentWeather'] = []
            outputRes['currentWeather'][0] = {
              currentCity: weatherArr[0]['currentCity'],
              pm25: weatherArr[0]['pm25'],
              date: weatherArr[0]['weather_data'][0]['date'],
              temperature: weatherArr[0]['weather_data'][0]['temperature'],
              weatherDesc: weatherArr[0]['weather_data'][0]['weather'],
              wind: weatherArr[0]['weather_data'][0]['wind'],
            }
            otherparam.success(outputRes)
          } else {
            otherparam.fail({
              errMsg: res['message'],
              statusCode: res['status'],
            })
          }
        },
        fail(data) {
          otherparam.fail(data)
        },
      })
    }
    let locationfail = function (result) {
      otherparam.fail(result)
    }
    let locationcomplete = function (result) {}
    if (!param['location']) {
      that.getWXLocation(type, locationsuccess, locationfail, locationcomplete)
    } else {
      let longitude = param.location.split(',')[0]
      let latitude = param.location.split(',')[1]
      let errMsg = 'input location'
      let res = {
        errMsg: errMsg,
        latitude: latitude,
        longitude: longitude,
      }
      locationsuccess(res)
    }
  }
}

export default BMapWX
